package org.example.factory01;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author liyishan
 * @date 2024/2/18 14:12
 * @apiNote
 */
@Slf4j
@Component
public class JdFactory {
    /**
     * 所有京东物流实现类的实例
     * ----
     * 自动注入全部子类的原理是基于Java的反射机制实现的。
     * Spring容器扫描项目中所有被标注了特定注解（例如@Component）的类，并将其实例化并注册为Bean。
     * 当一个类需要依赖其他Bean时，Spring会检查容器中已经注册的Bean类型，自动寻找可用的Bean进行依赖注入。
     * 如果一个接口有多个实现类，Spring会自动创建一个Map，以接口作为键，将所有实现类作为值，并注入到目标类中。
     */
    @Resource
    private Map<String, AbstractBaseJdStrategy> mapService = new ConcurrentHashMap<>();

    /**
     * 根据下发公司名称获取京东物流对应实现类
     *
     * @param distributeCompanyName 下发公司名称
     * @return {@code AbstractBaseJdStrategy}
     */
    public AbstractBaseJdStrategy getJdStrategy(String distributeCompanyName) {
        for (Map.Entry<String, AbstractBaseJdStrategy> jdStrategyEntry : mapService.entrySet()) {
            if (jdStrategyEntry.getValue().getCompany().contains(distributeCompanyName)) {
                log.info("当前策略所属: {}", distributeCompanyName);
                return jdStrategyEntry.getValue();
            }
        }
        log.error("京东物流未找到对应的税地策略: {}", distributeCompanyName);
        throw new RuntimeException("京东物流未找到对应的税地策略");
    }
}
